package myjava.innerclassi;

public class Root1 {

   public static void main(String[] args) {

      Reader s = new Reader("Laurent");
      s.read();
   }
}

class Reader {

   private String name;

   public Reader(String name) {
      this.name = name;
   }
   
   public void read() {
      Book b = new Book("Ask the dust");
      System.out.println("I am " + b.getOwnerName()  + " and I am reading " + b.getTitle());
   }

   /* INNER CLASSES
    - solitamente le si definiscono private perche' sono utili solo alla outerclass
    - hanno accesso a TUTTO il contenuto della outer class compreso la roba private
    - hanno accesso all'istanza della outer tramite lo shortcut nomeOuterClass.this
    - possono essere istanziate solo da metodi di istanza (senno devi usare le inner statiche) */
   private class Book {

      private Reader owner = Reader.this;
      private String title;

      public Book(String s) {
         this.title = s;
      }

      public String getTitle() {
         return this.title;
      }

      public String getOwnerName() {
         return this.owner.name;
      }
   }
}